#include "BaseType.h"
#include "Tracer.h"

using namespace libemb;
/**
 * 代理模式：
 * 1.为其他对象提供代理以控制对这个对象的访问
 * 适用场景：
 * 1.不想让客户直接跟某些对象接触
 **/

//服务接口
class Service{
DECL_CLASSNAME(Service)
public:
    virtual void service()=0;
};

//具体服务
class Server: public Service{
DECL_CLASSNAME(Server)
public:
    void service() override
    {
        TRACE_INFO_CLASS("service done.");
    }
};

//服务代理
class ServerProxy: public Service{
DECL_CLASSNAME(ServerProxy)
public:
    ServerProxy()
    {
        m_server = std::make_unique<Server>();
    }
    void service() override
    {
        TRACE_INFO_CLASS("I am service proxy.");
        m_server->service();
    }
private:
    std::unique_ptr<Server> m_server;
};

int main()
{
    Tracer::getInstance().setLevel(TRACE_LEVEL_DBG);
	Tracer::getInstance().addSink(std::make_shared<STDSink>()).start();

    //客户端只跟代理打交道,不需要知道具体服务的存在
    ServerProxy proxy;
    proxy.service();
    return RC_OK;
}